package coop.tecso.modelo1.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

import coop.tecso.modelo1.core.Cuenta;

public class OgnlNavigator{

	
	public OgnlNavigator(){
		
	}
	
	
	
	/**
	 * @LIST<String>: arma un listado de campos de la clase Cuenta
	 * 
	 */

	Cuenta CuentaProperties = new Cuenta(null, null, null);
	List<String> listPropertiesCuentas = CuentaProperties.getbeanProperties();

	
	
	/**
	 * @METHOD: traer un objeto, buscar por CBU
	 * 
	 * @param: contexto
	 * @param: String CBU
	 * 
	 * @result: imprime por pantalla todos los campos.
	 * 
	 */

	public void FindByCBU(OgnlContext contexto, String CBU) throws OgnlException{

		String expKey = CBU;
		for (String properties : listPropertiesCuentas) {
			try {
				String expField = properties;
				String expression = expKey + "." + expField;
				Object exp = Ognl.parseExpression(expression);
				Object result = Ognl.getValue(exp, contexto);
				System.out.println(properties + ": " + result);
			} catch (OgnlException e) {
				e.printStackTrace();
			}

		}
	}	
	
	/**
	 * @METHOD: traer un objeto, buscar por valor de campo seleccionado
	 * 
	 * @param: contexto
	 * @param: Map<String, Object> Map
	 * @param: String Field
	 * @param: String Value
	 * 
	 * @result: imprime por pantalla todos los campos con todas las cuentas.
	 * 
	 */
	
	public void findByField(OgnlContext contexto, Map<String, Object> map, String Field, String Value) throws OgnlException{
	String expField = Field;
	String expValue = Value;
	List<String> listKeys = new ArrayList<String>(map.keySet());	/* trae desde el mapa el listado de CBU */
	Iterator<String> itr = listKeys.iterator(); 					/* crea un iterator a partir del listado de CBU */
	while(itr.hasNext()) {
		try {
		    Object expKey = itr.next(); 	
			String expression = expKey+"."+expField+" == "+expValue;/* arma la expresion del string para Ognl */
			Object exp = Ognl.parseExpression(expression);		/* resuelve la expresion string para Ognl.getValue */
			Object result = Ognl.getValue(exp,contexto);				/* busca la expresion en el context map	*/
			if ((Boolean) result){
				OgnlNavigator newOgnlFind = new OgnlNavigator();	/* crea una instancia de la clase OgnlFinders */
				newOgnlFind.FindByCBU(contexto, (String)expKey );	/* hace una nueva busqueda con el objeto encontrado */			
			}						
		} catch (OgnlException e) {
			e.printStackTrace();
		}			

	}
	
	
	}		
		

	/**
	 * @METHOD: traer todos las objetos
	 * 
	 * @param: Map<String, Object> Map
	 * 
	 * @result: imprime por pantalla todos los campos con todas las cuentas.
	 * 
	 */
	
	public void findAllCuentas(OgnlContext contexto, Map<String, Object> map) throws OgnlException{
		List<String> listKeys = new ArrayList<String>(map.keySet()); 	/* trae desde el mapa el listado de CBU */
		Iterator<String> itr = listKeys.iterator();						/* crea un iterator a partir del listado de CBU */
		while (itr.hasNext()) {
			Object expKey = itr.next();
			for (String properties : listPropertiesCuentas) { 					/* por cada valor listado imprime sus campos */
				try {
					String expField = properties;
					String expression = expKey + "." + expField; 			/* arma la expresion del string para Ognl */
					Object exp = Ognl.parseExpression(expression); 		/* resuelve la expresion string para  Ognl.getValue */
					Object result = Ognl.getValue(exp, contexto); 			/* busca la expresion en el context map */
					System.out.println(properties + ": " + result);     /* imprime el resultado del campo indicado en la expersion */
				} catch (OgnlException e) {
					e.printStackTrace();
				}

			}
			System.out.println();

		}
	}
	
	
	
	
	
	

}
